البرمجة

أساسيات Active Record في Rails

أساسيات Active Record: التسمية، قراءة وكتابة البيانات، التوثيق، الاستدعاء، والتهجير

مقدمة

يُعد Active Record أحد أهم المكونات في إطار عمل Ruby on Rails، إذ يقدم واجهة برمجية قوية وفعالة للتعامل مع قواعد البيانات بطريقة كائنية (Object-Oriented). يمكّن هذا النمط المطورين من التعامل مع الصفوف في الجداول ككائنات حية لها خصائص وسلوكيات، مما يعزز من الإنتاجية ويقلل من الأخطاء المنهجية في التعامل مع البيانات. يُعتبر Active Record تجسيدًا حقيقيًا لنمط التصميم المعروف باسم Active Record Pattern الذي اقترحه Martin Fowler.

يتناول هذا المقال الموسع مختلف الأساسيات التي تقوم عليها مكتبة Active Record، بدءًا من التسمية، مرورًا بآليات القراءة والكتابة، ووصولًا إلى الجوانب المتعلقة بالتوثيق والاستدعاء والتهجير (Migration). الغرض من المقال تقديم محتوى غني، علمي وعملي، موجه للمطورين والباحثين في مجال تطوير البرمجيات باستخدام Ruby on Rails.


التسمية (Naming Conventions)

يعتمد Active Record على قواعد صارمة وواضحة للتسمية، مما يجعله قادراً على الاستدلال على أسماء الجداول والأعمدة تلقائيًا دون الحاجة لتعريف صريح.

قواعد التسمية في Active Record

  1. اسم الكلاس مفرد والجداول بصيغة الجمع:

    • الكلاس User يرتبط تلقائيًا بالجدول users.

    • الكلاس ArticleComment يرتبط بالجدول article_comments.

  2. الربط بين الكلاسات عن طريق العلاقات:

    • has_many :articles تشير إلى أن الكلاس يحتوي على مجموعة مقالات.

    • belongs_to :user تفترض وجود عمود باسم user_id.

  3. العواميد باستخدام snake_case:

    • العمود created_at يتم إنشاؤه تلقائيًا لتسجيل وقت الإنشاء.

    • العمود updated_at لتسجيل آخر تعديل.

هذه القواعد تسهّل على Active Record استنتاج الروابط والعلاقات بين الكائنات دون الحاجة لتعريف مكرر.


قراءة وكتابة البيانات (CRUD Operations)

تُعتبر العمليات الأساسية لقراءة وكتابة البيانات جوهر التفاعل مع قاعدة البيانات عبر Active Record. ويمكن تقسيمها إلى أربع عمليات أساسية معروفة باسم CRUD:

1. الإنشاء (Create)

يمكن إنشاء كائن جديد وربطه بقاعدة البيانات باستخدام:

ruby
user = User.new(name: "Ali", email: "[email protected]") user.save

أو بطريقة مباشرة:

ruby
User.create(name: "Ali", email: "[email protected]")

2. القراءة (Read)

يوفر Active Record واجهات متعددة لاسترجاع البيانات:

  • User.all : لاسترجاع جميع المستخدمين.

  • User.find(1) : لاسترجاع المستخدم الذي رقمه 1.

  • User.where(name: "Ali") : لاسترجاع جميع المستخدمين الذين اسمهم “Ali”.

  • User.first, User.last, User.find_by(email: "[email protected]").

3. التحديث (Update)

يمكن تحديث الكائنات باستخدام:

ruby
user = User.find(1) user.update(name: "Omar")

أو:

ruby
user.name = "Omar" user.save

4. الحذف (Delete)

  • user.destroy : لحذف كائن من قاعدة البيانات.

  • User.destroy(3) : حذف المستخدم برقم 3.

  • User.delete_all : حذف كل السجلات بدون استدعاء callbacks.


التوثيق (Validation)

واحدة من نقاط القوة في Active Record هي آلية التوثيق الداخلي التي تمنع إدخال بيانات غير صحيحة في قاعدة البيانات.

أنواع التوثيقات الشائعة

نوع التوثيق الاستخدام
validates_presence_of التأكد من أن الحقل ليس فارغًا
validates_uniqueness_of التأكد من أن القيمة فريدة
validates_length_of ضبط عدد الأحرف
validates_format_of التحقق من تطابق النمط باستخدام Regex
validates_numericality_of التأكد من أن القيمة عددية

مثال:

ruby
class User < ApplicationRecord validates :name, presence: true validates :email, presence: true, uniqueness: true end

تُفعل هذه التوثيقات عند حفظ الكائنات، وتمنع العمليات غير المتوافقة مع المعايير المحددة.


الاستدعاء (Callbacks)

الاستدعاءات (Callbacks) هي طرق تُنفذ تلقائيًا قبل أو بعد تنفيذ عمليات معينة على الكائن مثل الحفظ أو الحذف.

أنواع Callbacks

النوع التوقيت
before_validation قبل التحقق من صحة البيانات
after_validation بعد التحقق من صحة البيانات
before_save قبل الحفظ سواء للإنشاء أو التحديث
after_save بعد الحفظ
before_create قبل عملية الإنشاء فقط
after_create بعد عملية الإنشاء فقط
before_update قبل عملية التحديث فقط
after_update بعد عملية التحديث فقط
before_destroy قبل عملية الحذف
after_destroy بعد عملية الحذف

مثال تطبيقي:

ruby
class User < ApplicationRecord before_save :normalize_name private def normalize_name self.name = name.capitalize end end

التهجير (Migration)

التهجير هو آلية لإدارة بنية قاعدة البيانات بشكل تدريجي ومنظم باستخدام ملفات Ruby. تساعد هذه الملفات على إنشاء وتعديل الجداول والعواميد بسهولة.

إنشاء التهجير

يمكن إنشاء ملف تهجير باستخدام:

bash
rails generate migration CreateUsers name:string email:string

ينتج عن ذلك ملف يحتوي على تعريف للجدول:

ruby
class CreateUsers < ActiveRecord::Migration[7.0] def change create_table :users do |t| t.string :name t.string :email t.timestamps end end end

تنفيذ التهجير

bash
rails db:migrate

التراجع عن التهجير

bash
rails db:rollback

تحديث التهجير

عند الحاجة لتعديل بنية جدول موجود:

bash
rails generate migration AddAgeToUsers age:integer

العلاقات (Associations)

تُعد العلاقات بين الكائنات من أهم الميزات التي يوفرها Active Record، ما يسهم في بناء نموذج بيانات مترابط وواضح.

أنواع العلاقات

نوع العلاقة الاستخدام
belongs_to يدل على أن الكائن تابع لكائن آخر
has_one يدل على وجود كائن واحد مرتبط
has_many يدل على وجود عدة كائنات مرتبطة
has_many :through علاقة عبر جدول وسيط
has_and_belongs_to_many علاقة متعدد إلى متعدد بدون جدول وسيط

مثال:

ruby
class Article < ApplicationRecord belongs_to :user has_many :comments end class User < ApplicationRecord has_many :articles end

الجدول التوضيحي لمقارنة بين طرق التهجير والتعديل

العملية الأمر المستخدم الوصف
إنشاء جدول rails generate migration CreateTableName يُستخدم لإنشاء جداول جديدة
إضافة عمود rails generate migration AddColumnToTable يُستخدم لإضافة عمود لجدول موجود
تعديل نوع عمود تعديل يدوي داخل ملف التهجير لتغيير نوع البيانات في عمود معين
حذف عمود remove_column :table, :column لحذف عمود معين
تنفيذ التهجير rails db:migrate لتطبيق التهجير
التراجع عن آخر تهجير rails db:rollback للتراجع خطوة واحدة في التهجير

الخلاصة التقنية

يشكّل Active Record العمود الفقري لربط قواعد البيانات بنظام Ruby on Rails بطريقة ديناميكية وواضحة، تسمح للمطورين بالتعامل مع البيانات كما لو كانت كائنات مبرمجة برمجيًا. القوة الحقيقية لـ Active Record لا تكمن فقط في سهولة تنفيذ العمليات الأساسية (CRUD)، بل أيضًا في قدرته على تنظيم العلاقة بين الكائنات، وتقديم آليات مرنة للتحقق من صحة البيانات، والاستجابة للأحداث من خلال callbacks، وتسهيل إدارة البنية التحتية لقاعدة البيانات عبر Migrations.

بفضل هذه الأدوات، يصبح بإمكان فرق التطوير بناء تطبيقات معقدة بسرعة وكفاءة، مع تقليل الحاجة إلى كتابة استعلامات SQL يدويًا، مما يعزز من أمان التطبيق وسلامة البيانات.


المصادر